/**
 * Created by jude on 2015/12/17.
 */
var Pool = require('../connections/generic_pool');

/**
 *
 * @constructor
 */
function BaseDao() {

}

/**
 * 查询
 * @param sql    查询字符串
 * @param values 查询值
 * @param callback
 */
BaseDao.prototype.execQuery = function(sql, values, callback) {

    if(values && values instanceof Function) {
        callback = values;
        values = null;
    }
    // 判断callback参数
    if(!(callback instanceof Function)) {
        throw new TypeError('argument callback must be a function when provided');
    }

    // 判断sql类型
    if(!sql || typeof sql !== 'string') {
        throw new TypeError('argument sql must be a string when provided');
    }

    // 获取数据库连接
    Pool.getConn(function(conn) {
        if(values) {
            // 执行查询
            conn.query(sql, values, function(err, rows) {
                // console.log(this.sql)
                // 释放当前连接
                Pool.pool.release(conn);
                // 返回结果
                callback(err, rows);
            });
        } else {
            // 执行查询
            conn.query(sql, function(err, rows) {
                // 释放当前连接
                Pool.pool.release(conn);
                // 返回结果
                callback(err, rows);
            });
        }
    });
};

/**
 * 插入记录
 * @param sql
 * @param values
 * @param callback
 */
BaseDao.prototype.execInsert = function(sql, values, callback) {
    // 判断callback参数
    if(!(callback instanceof Function)) {
        throw new TypeError('argument callback must be a function when provided');
    }

    // 判断sql类型
    if(!sql || typeof sql !== 'string') {
        throw new TypeError('argument sql must be a string when provided');
    }

    // 获取数据库连接
    Pool.getConn(function(conn) {
        // 开始事务管理
        conn.beginTransaction(function(err) {
            if(err) { throw err; }
            // 执行查询
            conn.query(sql, values, function(err, result) {
                // for debug
                result = result || {};
                //result.sql = this.sql;

                if(err) {
                    return conn.rollback(function() {
                        Pool.pool.release(conn);
                        callback(err, result);
                    });
                }

                conn.commit(function(err) {
                    if(err) {
                        return conn.rollback(function() {
                            Pool.pool.release(conn);
                            callback(err, result);
                        });
                    }
                    // 释放当前连接
                    Pool.pool.release(conn);
                    // 返回结果
                    callback(null, result);
                });
            });
        });
    });
};

/**
 * 执行删除操作
 * @param sql
 * @param values
 * @param callback
 */
BaseDao.prototype.execDelete = function(sql, values,callback) {
    // 判断callback参数
    if(!(callback instanceof Function)) {
        throw new TypeError('argument callback must be a function when provided');
    }

    // 判断sql类型
    if(!sql || typeof sql !== 'string') {
        throw new TypeError('argument sql must be a string when provided');
    }

    // 获取数据库连接
    Pool.getConn(function(conn) {
        // 开始事务管理
        conn.beginTransaction(function(err) {
            if(err) { throw err; }
            // 执行查询
            conn.query(sql, values, function(err, result) {
                // for debug
                result = result || {};
                //result.sql = this.sql;

                if(err) {
                    return conn.rollback(function() {
                        Pool.pool.release(conn);
                        callback(err, result);
                    });
                }

                conn.commit(function(err) {
                    if(err) {
                        return conn.rollback(function() {
                            Pool.pool.release(conn);
                            callback(err, result);
                        });
                    }
                    // 释放当前连接
                    Pool.pool.release(conn);
                    // 返回结果
                    callback(null, result);
                });
            });
        });
    });
};

/**
 * 执行更新操作
 * @param sql
 * @param values
 * @param callback
 */
BaseDao.prototype.execUpdate = function(sql, values, callback) {
    // 判断callback参数
    if(!(callback instanceof Function)) {
        throw new TypeError('argument callback must be a function when provided');
    }

    // 判断sql类型
    if(!sql || typeof sql !== 'string') {
        throw new TypeError('argument sql must be a string when provided');
    }

    // 获取数据库连接
    Pool.getConn(function(conn) {
        // 开始事务管理
        conn.beginTransaction(function(err) {
            if(err) { throw err; }
            // 执行查询
            conn.query(sql, values, function(err, rows) {
                if(err) {
                    return conn.rollback(function() {
                        Pool.pool.release(conn);
                        callback(err);
                    });
                }

                conn.commit(function(err) {
                    if(err) {
                        return conn.rollback(function() {
                            Pool.pool.release(conn);
                            callback(err);
                        });
                    }
                    // 释放当前连接
                    Pool.pool.release(conn);
                    // 返回结果
                    callback(null, rows);
                });
            });
        });
    });
};

var baseDao = module.exports = exports = new BaseDao();